package br.com.mftc.efitness.negocio;

import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;

import br.com.mftc.efitness.basicas.Operador;
import br.com.mftc.efitness.dados.DadosOperador;
import br.com.mftc.efitness.dados.IDadosOperador;
import br.com.mftc.efitness.excecoes.ExcecaoCamposObrigatoriosNaoPreenchidos;
import br.com.mftc.efitness.excecoes.ExcecaoNegocio;
import br.com.mftc.efitness.util.Util;
import br.com.mftc.efitness.util.Variaveis;

public class ControladorOperador {
	
	private final IDadosOperador dadosOperador;
	
	public ControladorOperador() {
		dadosOperador = new DadosOperador();
	}

	public Operador inserir(Operador operador) throws ExcecaoCamposObrigatoriosNaoPreenchidos, ExcecaoNegocio {
		if (operador.getLogin() == null || operador.getLogin().trim().equals("")) {
			throw new ExcecaoCamposObrigatoriosNaoPreenchidos(Variaveis.EXCECAO_OPERADOR_INFORME_LOGIN);
		} else if (operador.getLogin().length() > 30 || Util.contemCaracteresEspeciais(operador.getLogin())) {
			throw new ExcecaoNegocio(Variaveis.EXCECAO_OPERADOR_INVALIDO_LOGIN);
		} else if (operador.getSenha() == null || operador.getSenha().trim().equals("")) {
			throw new ExcecaoCamposObrigatoriosNaoPreenchidos(Variaveis.EXCECAO_OPERADOR_INFORME_SENHA);
		} else if (operador.getSenha().length() < 6) {
			throw new ExcecaoNegocio(Variaveis.EXCECAO_OPERADOR_INVALIDO_SENHA);
		} else if (operador.getNome() == null || operador.getNome().trim().equals("")) {
			throw new ExcecaoCamposObrigatoriosNaoPreenchidos(Variaveis.EXCECAO_OPERADOR_INFORME_NOME);
		} else if (operador.getNome().length() > 230 || Util.contemCaracteresEspeciais(operador.getNome())) {			
			throw new ExcecaoNegocio(Variaveis.EXCECAO_OPERADOR_INVALIDO_NOME);
		} else if (operador.getEmail() != null && !operador.getEmail().trim().equals("") && !Util.validarEmail(operador.getEmail())) {
			throw new ExcecaoNegocio(Variaveis.EXCECAO_OPERADOR_INVALIDO_EMAIL);
		} else if (operador.getPerfilDeUsuario() == null) {
			throw new ExcecaoCamposObrigatoriosNaoPreenchidos(Variaveis.EXCECAO_OPERADOR_INFORME_PERFIL);
		} else {
			try {
				// CRIPTOGRAFIA DA SENHA
				operador.setSenha(Util.criptografarSenhaMD5(operador.getSenha()));
				operador.setDataDeCriacao(Util.agora());
				operador.setDataDeUltimaAtualizacao(Util.agora());
				try {
					dadosOperador.iniciarTransacao();
					dadosOperador.inserir(operador);
					dadosOperador.finalizarTransacao();
					return operador;
				} catch (Exception excecao) {
					try {
						dadosOperador.desfazerTransacao();
						throw new ExcecaoNegocio(excecao);
					} catch (Exception excecaoAux) {
						throw new ExcecaoNegocio(excecaoAux);
					}
				}
			} catch (NoSuchAlgorithmException | UnsupportedEncodingException excecao) {
				throw new ExcecaoNegocio(Variaveis.EXCECAO_FALHA_CRIPTOGRAFIA_SENHA);
			}
		}
	}
}
